iT邦幫忙

2025 iThome 鐵人賽

DAY 5
0

資安倫理宣導

引用自 Kazma 的 Flipper Zero 宇宙最強攻略:30 天帶你從入門到入坑系列文

請注意,透過 Flipper Zero 所學到的技術與知識,主要目的是提升個人技術能力與資訊安全意識。我們強烈呼籲各位,不要將這些知識應用於任何違法活動。您有責任確保所學知識的合法用途。針對今天的主題,大家務必要注意以下幾點:

絕對不要測試不屬於自己的設備,或是未經授權的設備。
切勿測試您自己日常使用的或生活必需的裝置。
重放攻擊(Replay Attack)或是訊號模糊測試(Fuzzing Signals)有可能導致接收器與發射設備不同步,並可能造成損壞,後果須自行承擔。

有了 Flipper Zero 就可以像 GTA 橫行無阻(嗎?

雖說 Flipper Zero 可以使用 Sub-GHz 分析(Analyze)、讀取(Read),甚至可以模擬(Emulate)汽車遙控器的訊號,但這樣就代表我們可以透過 Flipper Zero 來破解遙控器嗎?

(門口那輛賓士,想試駕你很久了。)

這就要來說說 Sub-Ghz 的幾種不同的 Code (編碼)——遙控器發射給接收端的「控制訊號內容」,也就一串二進位的編碼,透過這個編碼,接收端才會知道控制器要執行「開門」、「關門」或是觸發某個功能,而常見的編碼有固定碼(Static Code)、滾動碼(Rolling Code)、學習碼(Learning Code)等幾種不同的編碼方式。

固定碼 Static Code

碼如其名,Static Code 的意思代表每次發射出去的訊號內容都是固定的,可以想像成一把鑰匙,不管是誰複製了這把鑰匙,都可以打對應的門,也因此固定碼是最容易被複製的編碼方式。

這訊號是一組事先定義好的位元序列(binary code),像是 00110101,接收端會比對這組序列與儲存的「授權碼」,如果吻合的話,就會執行相對應的功能。

常見的 Static Code 訊號的頻段有 315 MHz、433.92 MHz、868 MHz、915 MHz 等,而不同的遙控器品牌會使用不同的頻段,所以我們在使用 Flipper Zero 時,也需要先設定好對應的頻段才能收到訊號。

調變(Modulation)

但光是有固定碼(Static Code)還不夠,因為編碼只是內容,我們還要想辦法把這個訊號發射出去,為了要把這個訊號發射出去,我們還需要使用「調變(Modulation)」的方法,把資料裝上高頻載波,讓天線有效地把訊號輻射出去。

那為什麼需要高頻載波呢?為什麼不能直接把訊號發射出去就好呢?

想像所有人都在同一個頻道上大喊「010101(要傳送的資料)」,彼此的聲音全部會互相干擾,導致大家都聽不懂對方在說什麼,所以我們可以把各自的資料放在不同的頻率(像 98.7 MHz、99.5 MHz 等),接收者只要轉到正確的頻道,就可以聽到對方在說什麼了。

還有一個原因是空氣中有很多低頻雜訊(電線、馬達、家電等電磁干擾),如果把資料搬到高頻段,就可以避免被雜訊干擾,這樣訊號可以更清楚地被傳送,能夠傳送的距離也會更遠。

OOK / ASK

調變有很多種方法,像是改振幅(AM/ASK/OOK)、改頻率(FM/FSK)、改相位(PSK)、或更進階(QAM/OFDM)。

其中 ASK(Amplitude Shift Keying)指的是用不同「振幅高度」代表不同的符號,最簡單的兩種振幅(高/低)代表 1/0,當然也可以拓展成更多級振幅來代表更多種符號(更多資訊)。

OOK(On-Off Keying)是 ASK 的一種特殊情況,指的是只有兩種振幅(開/關),分別代表 1/0:

  • 有載波(on):代表 1
  • 無載波(off):代表 0

而以 Sub-GHz 遙控器來說,設計者常選 OOK/ASK,原因是:

  • 電路最簡單、成本最低:發射端只要「開/關或調高/調低」射頻放大器的輸出振幅就能送資料。
  • 接收端成本便宜:用「包絡檢波器(envelope detector)」就能把振幅起伏變回 0/1,不需高複雜度數位訊號處理。
  • 資料率需求低:遙控器只送少量按鍵資訊,OOK/ASK 的頻譜效率不高也沒關係。
  • 省電:特別是 OOK,傳輸「0」時可以幾乎不發射載波,平均耗電更低,適合鈕扣電池。

所以整個流程會是:

  • 按下遙控器按鈕,並且產生固定碼,並且加上前導、同步、校驗等框架。
  • 把位元序列轉換成一串「寬窄不同的脈衝」
  • 把脈衝的「高/低」映射為載波振幅的開/關(OOK)或高/低(ASK)
  • 脈衝電磁波會在空中傳播,此時會發生衰減、雜訊、反射等干擾現象。
  • 用窄帶濾波鎖到指定的頻率(例如:433 MHz) ,再進行包絡檢波(envelope detection)把振幅起伏還原成位元
  • 對位元進行驗證前導、同步、校驗,比對 payload 是否為已學習的固定碼
  • 比對成功後,會進行原本遙控的動作(例如:開燈)

包絡檢波(envelope detection)」是無線電常見的一種解調方法。

滾動碼 Rolling Code

相對於固定碼只要能成功複製,就能重播並使用,聽起來相當地不安全,滾動碼則是我們每次在按壓遙控器時,發射出來的「控制碼」都不一樣,當這個控制碼發射後,發射器會根據加密演算法,再滾動產生下一個碼,同樣地接收器在接受到控制碼後也會同步更新,只接受「符合演算法規則的下一組碼」。

透過這個加密演算法,就能夠有效防止重播攻擊(Replay Attack),因為即使攻擊者截取到控制碼,再模擬播送一次,接收器會拒絕,而且攻擊者也無法知道下一組控制碼是什麼,也就無法進行重播攻擊,。

可以想像成一次性密碼(OTP),用過一次就換下一個,舊的馬上作廢。

完整的流程會是這樣:

  • 遙控器與接收器在某時刻共享一組秘密(密鑰)與計數器(counter)。
  • 遙控器內部把當前計數器值代入密鑰演算法(例如某種對稱加密或已定義的加密函數),輸出一組「發射碼」(transmission code)。
  • 遙控器把這組發射碼送出,並把內部計數器遞增。
  • 接收器收到發射碼後,用相同密鑰與可能的一系列計數器值(例如「期望的 counter 到允許的最大差距」)在本地模擬產生碼,若有符合,就接受並把自己的計數器同步到相應值;若不在可接受範圍內,接收端拒絕(不執行命令)。

這是可能會想說,那萬一不小心在別的地方按了遙控器,接收器也沒接受到的狀況下,導致計數器不同步,那不就完蛋了嗎?

所以其實在滾動碼的設計中,會有幾個策略可以避免或有條件地容許這種狀況:

  • 限制最大差距:接收器只接受在某個範圍內的計數器值,超出範圍就拒絕。
  • 重置計數器:接收器在一段時間(例如 10 分鐘)內未收到有效命令,就重置計數器到初始值。

如果發生太多未同步的按鍵(超過容錯範圍),接收端可能要求「重做配對程序」或人工重置。

所以門口那輛賓士可以開嗎

講到這裡應該不難推測,汽車遙控器通常會使用滾動碼(Rolling Code)的編碼方式,所以我們即使可以截取到控制碼,也無法進行重播攻擊,也就無法開門。

不過,如果我們可以找到某輛賓士的遙控器,並且可以截取到控制碼,那麼我們就可以使用 Flipper Zero 來模擬這個控制碼,並搭配上滾動碼的演算法,就可以製作出一把新的遙控器,來試駕了。


上一篇
Day04 - 原來這就是 Sub-GHz 呀
系列文
媽媽我想養海豚:從零摸索 Flipper Zero5
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言